import java.io.*;
import java.net.Socket;
import java.util.Properties;

public class Mythread extends Thread {
    Socket socket;
    Properties p;

    public Mythread(Socket socket, Properties p) {
        this.socket = socket;
        this.p = p;
    }

    @Override
    public void run() {
        //读取客户端发送过来的数据(用户名和密码）
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true) {
                String choose = br.readLine();
                switch (choose) {
                    case "login" -> login(br);
                    case "register" -> System.out.println("用户选择了注册操作");
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    //获取用户登录时，传递过来的信息。
    //并进行判断
    //读取客户端发送过来的数据(用户名和密码）
    public void login(BufferedReader br) throws IOException {
        System.out.println("用户选择了登录操作");
        String userinfo = br.readLine();
        //username=zhangsan&password=123
        //将用户名和密码进行拆分
        String[] arr = userinfo.split("&");
        String usernameInput = arr[0].split("=")[1];
        String passwordInput = arr[1].split("=")[1];
        System.out.println("用户输入的用户名为:" + usernameInput);
        System.out.println("用户输入的密码为:" + passwordInput);
        if (p.containsKey(usernameInput)) {
            //如果用户名存在，继续判断密码  //通过用户名获取密码（键获取值）
            String rightPassword = p.get(usernameInput) + "";
            if (rightPassword.equals(passwordInput)) {
                //提示用户登录成功，可以开始聊天
                writeMessage2Client("1");
                //群发
                //登录成功的时候就需要把客服端的Socket对象保存起来，方便后面给其他用户发送消息
                Server.list.add(socket);//类名直接调用集合，保存所有的用户对象，方便对每一个用户客服端群发
                //接受客户端发送过来的消息，并打印到控制台
                talkAll1(br, usernameInput);
            } else {
                //密码输入有误
                writeMessage2Client("2");
            }
        } else {
            //如果用户名不存在，直接回写
            writeMessage2Client("3");
        }
    }

    //读取客户端发送过来的消息，并打印到控制台
    private void talkAll1(BufferedReader br, String username) throws IOException {
        while (true) {
            String message = br.readLine();
            System.out.println(username + "发送的消息：" + message);

            //群发
            for (Socket s : Server.list) {
                //s代表每一个客服端的Socket连接对象
                writeMessage2Client(s, username + "发送的消息：" + message);
            }
        }

    }


    //作用：服务端将消息发送给所有用户的客服端（群发）
    public void writeMessage2Client(Socket s, String message) throws IOException {
        // 写出数据
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write(message);
        bw.newLine();
        bw.flush();
    }

    /*
    作用： 将服务器端的消息回写客户端
     */
    public void writeMessage2Client(String message) throws IOException {
        // 写出数据
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(message);
        bw.newLine();
        bw.flush();
    }
}
